a11y: Add get_renderer_state() to cell accessibles
authorBenjamin Otte <otte@redhat.com>
Thu, 24 Nov 2011 00:55:38 +0000 (01:55 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 24 Nov 2011 17:29:45 +0000 (18:29 +0100)
Accessibles can use this function to query the state that their row
would be rendered with.

gtk/a11y/gtkcellaccessible.c
gtk/a11y/gtkcellaccessible.h
gtk/a11y/gtkcellaccessibleparent.c
gtk/a11y/gtkcellaccessibleparent.h
gtk/a11y/gtktreeviewaccessible.c

index bc503a9c27e0907f79c4219cfc6b5b4fbc548a83..47c5f97314a19783e24afa24e71ada182214bbaa 100644 (file)
@@ -445,3 +445,38 @@ _gtk_cell_accessible_set_cell_data (GtkCellAccessible *cell)
   _gtk_cell_accessible_parent_set_cell_data (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
 }
 
+/**
+ * _gtk_cell_accessible_get_state:
+ * @cell: a #GtkCellAccessible
+ * @expandable: (out): %NULL or pointer to boolean that gets set to
+ *     whether the cell can be expanded
+ * @expanded: (out): %NULL or pointer to boolean that gets set to
+ *     whether the cell is expanded
+ *
+ * Gets the state that would be used to render the area referenced by @cell.
+ *
+ * Returns: the #GtkCellRendererState for cell
+ **/
+GtkCellRendererState
+_gtk_cell_accessible_get_state (GtkCellAccessible *cell,
+                                gboolean          *expandable,
+                                gboolean          *expanded)
+{
+  AtkObject *parent;
+
+  g_return_val_if_fail (GTK_IS_CELL_ACCESSIBLE (cell), 0);
+
+  if (expandable)
+    *expandable = FALSE;
+  if (expanded)
+    *expanded = FALSE;
+
+  parent = gtk_widget_get_accessible (cell->widget);
+  if (parent == NULL)
+    return 0;
+
+  return _gtk_cell_accessible_parent_get_renderer_state (GTK_CELL_ACCESSIBLE_PARENT (parent),
+                                                         cell,
+                                                         expandable,
+                                                         expanded);
+}
index 823ae8dfbc92845209ec35d1e8bf9b07f8811551..84cd4bff2b7f3124d76b3b64184fe28d435151ba 100644 (file)
@@ -50,6 +50,10 @@ struct _GtkCellAccessibleClass
 
 GType    _gtk_cell_accessible_get_type      (void);
 
+GtkCellRendererState
+         _gtk_cell_accessible_get_state     (GtkCellAccessible *cell,
+                                             gboolean          *expandable,
+                                             gboolean          *expanded);
 void     _gtk_cell_accessible_set_cell_data (GtkCellAccessible *cell);
 
 void     _gtk_cell_accessible_initialise    (GtkCellAccessible *cell,
index 76c6b76411e25676aaddeb63b666070c13b48960..6f76ccb1468752c94ff938fa7418aef632cc6462 100644 (file)
@@ -112,6 +112,30 @@ _gtk_cell_accessible_parent_get_child_index (GtkCellAccessibleParent *parent,
     return -1;
 }
 
+GtkCellRendererState
+_gtk_cell_accessible_parent_get_renderer_state (GtkCellAccessibleParent *parent,
+                                                GtkCellAccessible       *cell,
+                                                gboolean                *expandable,
+                                                gboolean                *expanded)
+{
+  GtkCellAccessibleParentIface *iface;
+
+  g_return_val_if_fail (GTK_IS_CELL_ACCESSIBLE_PARENT (parent), 0);
+  g_return_val_if_fail (GTK_IS_CELL_ACCESSIBLE (cell), 0);
+
+  iface = GTK_CELL_ACCESSIBLE_PARENT_GET_IFACE (parent);
+
+  if (expandable)
+    *expandable = FALSE;
+  if (expanded)
+    *expanded = FALSE;
+
+  if (iface->get_renderer_state)
+    return (iface->get_renderer_state) (parent, cell, expandable, expanded);
+  else
+    return 0;
+}
+
 void
 _gtk_cell_accessible_parent_set_cell_data (GtkCellAccessibleParent *parent,
                                            GtkCellAccessible       *cell)
index 797a7842671a7cbd5510e08f6314b25360666e31..78edf0298d3ee242c68c3414c82c8d93a1bf2660 100644 (file)
@@ -60,6 +60,11 @@ struct _GtkCellAccessibleParentIface
                                  GtkCellAccessible       *cell);
   int      ( *get_child_index)  (GtkCellAccessibleParent *parent,
                                  GtkCellAccessible       *cell);
+  GtkCellRendererState
+           ( *get_renderer_state) (GtkCellAccessibleParent *parent,
+                                 GtkCellAccessible       *cell,
+                                 gboolean                *expandable,
+                                 gboolean                *expanded);
   void     ( *set_cell_data)    (GtkCellAccessibleParent *parent,
                                  GtkCellAccessible       *cell);
 
@@ -81,6 +86,11 @@ gboolean _gtk_cell_accessible_parent_grab_focus       (GtkCellAccessibleParent *
                                                        GtkCellAccessible       *cell);
 int      _gtk_cell_accessible_parent_get_child_index  (GtkCellAccessibleParent *parent,
                                                        GtkCellAccessible       *cell);
+GtkCellRendererState
+         _gtk_cell_accessible_parent_get_renderer_state(GtkCellAccessibleParent *parent,
+                                                       GtkCellAccessible       *cell,
+                                                       gboolean                *expandable,
+                                                       gboolean                *expanded);
 void     _gtk_cell_accessible_parent_set_cell_data    (GtkCellAccessibleParent *parent,
                                                        GtkCellAccessible       *cell);
 
index d8bf3d61ca0016ac8b83c19955d3817fdd8357fa..bdc853db016af81bb02bf931fd61c37f0b2c8df0 100644 (file)
@@ -1516,6 +1516,64 @@ gtk_tree_view_accessible_get_child_index (GtkCellAccessibleParent *parent,
   return cell_info_get_index (tree_view, cell_info);
 }
 
+static GtkCellRendererState
+gtk_tree_view_accessible_get_renderer_state (GtkCellAccessibleParent *parent,
+                                             GtkCellAccessible       *cell,
+                                             gboolean                *expandable,
+                                             gboolean                *expanded)
+{
+  GtkTreeViewAccessibleCellInfo *cell_info;
+  GtkTreeView *treeview;
+  GtkCellRendererState flags;
+
+  cell_info = find_cell_info (GTK_TREE_VIEW_ACCESSIBLE (parent), cell);
+  if (!cell_info)
+    return 0;
+
+  flags = 0;
+
+  if (GTK_RBNODE_FLAG_SET (cell_info->node, GTK_RBNODE_IS_SELECTED))
+    flags |= GTK_CELL_RENDERER_SELECTED;
+
+  if (GTK_RBNODE_FLAG_SET (cell_info->node, GTK_RBNODE_IS_PRELIT))
+    flags |= GTK_CELL_RENDERER_PRELIT;
+
+  if (gtk_tree_view_column_get_sort_indicator (cell_info->cell_col_ref))
+    flags |= GTK_CELL_RENDERER_SORTED;
+
+  treeview = GTK_TREE_VIEW (gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)));
+  if (gtk_widget_has_focus (GTK_WIDGET (treeview)))
+    {
+      GtkTreeViewColumn *column;
+      GtkTreePath *path;
+      GtkRBTree *tree;
+      GtkRBNode *node;
+      
+      gtk_tree_view_get_cursor (treeview, &path, &column);
+      if (path)
+        {
+          _gtk_tree_view_find_node (treeview, path, &tree, &node);
+          gtk_tree_path_free (path);
+        }
+      else
+        tree = NULL;
+
+      if (cell_info->cell_col_ref == column
+          && cell_info->tree == tree
+          && cell_info->node == node)
+        flags |= GTK_CELL_RENDERER_FOCUSED;
+    }
+
+  if (expandable)
+    *expandable = GTK_RBNODE_FLAG_SET (cell_info->node, GTK_RBNODE_IS_PARENT)
+                  && cell_info->cell_col_ref == gtk_tree_view_get_expander_column (treeview);
+  if (expanded)
+    *expanded = cell_info->node->children
+                && cell_info->cell_col_ref == gtk_tree_view_get_expander_column (treeview);
+
+  return flags;
+}
+
 static void
 gtk_tree_view_accessible_set_cell_data (GtkCellAccessibleParent *parent,
                                         GtkCellAccessible       *cell)
@@ -1568,6 +1626,7 @@ gtk_cell_accessible_parent_interface_init (GtkCellAccessibleParentIface *iface)
   iface->get_cell_area = gtk_tree_view_accessible_get_cell_area;
   iface->grab_focus = gtk_tree_view_accessible_grab_cell_focus;
   iface->get_child_index = gtk_tree_view_accessible_get_child_index;
+  iface->get_renderer_state = gtk_tree_view_accessible_get_renderer_state;
   iface->set_cell_data = gtk_tree_view_accessible_set_cell_data;
 }